package com.lx.seckill.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * TODO 添加描述
 *
 * @author wangLJ
 * @date 2024/7/20 15:15
 */
@Configuration
public class AsyncConfig {

    /**
     * 没有设计好的线程池
     */
//    @Bean(name = "threadPoolTaskExecutor")
//    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
//        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//        executor.setCorePoolSize(5); // 核心线程数
//        executor.setMaxPoolSize(10); // 最大线程数
//        executor.setQueueCapacity(20); // 队列大小
//        executor.setThreadNamePrefix("MyExecutor-"); // 线程名前缀
//        executor.initialize();
//        return executor;
//    }


    /**
     * 优化线程池
     * @return
     */
//    @Bean(name = "threadPoolTaskExecutor")
//    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
//        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//        executor.setCorePoolSize(20); // 核心线程数
//        executor.setMaxPoolSize(30); // 最大线程数
//        executor.setQueueCapacity(90); // 队列大小
//        executor.setThreadNamePrefix("MyExecutor-"); // 线程名前缀
//        executor.initialize();
//        return executor;
//
//    }

    /**
     * 添加线程拒绝策略，
     * 处理方案
     * 增加线程池大小：
     *          如果您的任务执行时间较长，并且并发量较高，可以考虑增加 maxPoolSize，以便能够容纳更多的并发任务。
     * 增加队列大小：
     *          如果任务执行时间较短，但任务到达频率较高，可以适当增加 queueCapacity，以允许更多的任务排队等待执行。
     * 调整核心线程数：
     *          调整 corePoolSize 可以帮助平衡线程池中的线程数量，确保有足够的线程来处理任务，但又不至于过多地占用系统资源。
     * 使用拒绝策略：
     *          当线程池无法接收更多任务时，默认情况下，ThreadPoolExecutor 会抛出 RejectedExecutionException。可以通过设置拒绝策略来处理这种情况。常见的拒绝策略包括：
     *                  AbortPolicy：默认策略，抛出 RejectedExecutionException。
     *                  CallerRunsPolicy：由调用线程处理被拒绝的任务。
     *                  DiscardPolicy：丢弃被拒绝的任务，不做任何处理。
     *                  DiscardOldestPolicy：丢弃队列中最老的任务，并重新尝试提交被拒绝的任务。
     * @return
     */
    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 核心线程数
        executor.setMaxPoolSize(20); // 增加最大线程数
        executor.setQueueCapacity(50); // 增加队列大小
        executor.setThreadNamePrefix("MyExecutor-"); // 线程名前缀
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 设置拒绝策略
        executor.initialize();
        return executor;
    }


}
